home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Systemmonitors / Snoopy / Macros / startup < prev   
Text File  |  1996-09-26  |  7KB  |  250 lines

  1.  
  2.         STRUCTURE    ToolTypeHilfe,0
  3.         ULONG    tth_Kennung        ; MUSS mit "TTHi" gefüllt werden!
  4.         APTR    tth_WBStartup        ; WBStartup oder NULL
  5.         APTR    tth_DirLock        ; Lock auf Pfad des Programms (immer gefüllt)
  6.         STRUCT    tth_FileName,32        ; Dateiname (immer gefüllt)
  7.         LABEL    tth_SIZEOF
  8.  
  9. ;--------------    DUE TO POPULAR DEMAND: this is the listing of my world-famous
  10. ;--------------    "DETACHSTARTUPARGS" macro VERY loosely based upon the XOper
  11. ;--------------    startup code (that was years ago, pal, get real!) . However I
  12. ;--------------    really won't translate the comments for you, coz I really 
  13. ;--------------    got more important things to do. Don't mess around this macro,
  14. ;--------------    just use it if you want to...........
  15.  
  16. ;--------------    Startet das Programm wie 'Runback'. 
  17. ;--------------    
  18. ;--------------    Folgende Daten müssen im Hauptprogramm definiert sein :
  19. ;--------------    
  20. ;--------------    dosName        dc.b    "dos.library",0
  21. ;--------------            even
  22. ;--------------    dosBase        dc.l    0
  23. ;--------------    
  24. ;--------------    Es wird die ToolTypeHilfs-Struktur in TC_Userdata übergeben.
  25. ;--------------    Die Einträge my.DirLock und my.FileName werden jetzt immer
  26. ;--------------    initialisiert.
  27.  
  28. DETACHSTARTUPARGS    MACRO    ;\1=template,\2=storage,\3=Name des Hauptprogramms,[\4=Stackgröße]
  29.  
  30.         section    DetachStartupCode,code,chip
  31.  
  32. ;--------------    DOS.Library öffnen
  33. StartupCode    lea    (dosName),a1
  34.         movea.l    (execBase).w,a6
  35.         lea    (LibList,a6),a0
  36.         CALL    FindName
  37.         move.l    d0,(dosBase)
  38.  
  39. ;--------------    Eventuell Message von der Workbench holen
  40.         movea.l    (ThisTask,a6),a4
  41.         tst.l    (pr_CLI,a4)
  42.         bne.b    .notwb
  43.         lea    (pr_MsgPort,a4),a0
  44.         CALL    WaitPort
  45.         lea    (pr_MsgPort,a4),a0
  46.         CALL    GetMsg
  47.         move.l    d0,(wb.msg)
  48.         beq.b    .gomain
  49.         movea.l    d0,a0
  50.         movea.l    (sm_ArgList,a0),a0
  51.         move.l    (wa_Lock,a0),(my.DirLock)    ; DirLock
  52.         movea.l    (wa_Name,a0),a0
  53.         lea    (my.FileName),a1
  54. ..loop        move.b    (a0)+,(a1)+            ; Dateiname kopieren
  55.         bne.b    ..loop
  56. .gomain        jmp    MainStartCode
  57.  
  58. ;--------------    NEU: Args vom CLI einlesen
  59. .notwb        move.l    #\1,d1
  60.         move.l    #\2,d2
  61.         moveq    #0,d3
  62.         CALL    ReadArgs,<(dosBase)>
  63.         move.l    d0,(argRdargs)
  64.         bne.b    .FAIL_ARGS
  65.         moveq    #RETURN_ERROR,d0
  66.         rts
  67. .FAIL_ARGS
  68. ;--------------    
  69.         link    a5,#-108        ; Platz für Dateiname schaffen
  70.         move.l    (pr_CurrentDir,a4),d1
  71.         CALL    CurrentDir
  72.         move.l    d0,d7            ; D7: OldCurrentDir
  73.         BMOVE    <(pr_CLI,a4)>,a4
  74.         BMOVE    <(cli_CommandName,a4)>,a1
  75.         movea.l    sp,a0
  76.         moveq    #0,d0
  77.         move.b    (a1)+,d0        ; Länge des Namens
  78.         subq.w    #1,d0
  79.         bcs.b    .nullstring
  80.         move.w    d0,d1
  81. .copyname    move.b    (a1)+,(a0)+        ; Dateiname kopieren
  82.         dbf    d0,.copyname
  83. .nullstring    clr.b    (a0)            ; Nullbyte anhängen
  84.         movea.l    sp,a0
  85. ..loop        cmpi.b    #"/",(a0,d1.W)        ; Dateiname mit relativem Pfad?
  86.         beq.b    .EinfachLock        ; ja, dann gleich Lock()
  87.         cmpi.b    #":",(a0,d1.W)
  88.         beq.b    .EinfachLock        ; ja, dann gleich Lock()
  89.         dbf    d1,..loop
  90.         moveq    #ACCESS_READ,d2
  91.         move.l    sp,d1
  92.         CALL    Lock
  93.         move.l    d0,d5            ; D5: FileLock
  94.         bne.b    .LockGefunden
  95.         BMOVE    <(cli_CommandDir,a4)>,a4    ; Zeiger auf unsere Pfadliste
  96. .PfadDurchgehen    move.l    (4,a4),d1            ; d1=Unser Lock
  97.         CALL    CurrentDir
  98.         move.l    sp,d1
  99.         CALL    Lock
  100.         move.l    d0,d5                ; D5: FileLock
  101.         bne.b    .LockGefunden
  102.         BMOVE    <(a4)>,a4            ; Nächster Lock
  103.          tst.l    d0                ; Gibt es noch einen Lock ?
  104.         bne.b    .PfadDurchgehen            ; Ja, weitermachen
  105.         bra    .KeinLock
  106. .LockGefunden    move.l    d0,d1
  107.         CALL    CurrentDir
  108.         move.l    d0,d1
  109.         move.l    d0,d4
  110.         CALL    DupLock                ; DirLock duplizieren und
  111.         move.l    d0,(my.DirLock)            ; für Hauptprogramm retten
  112.         move.l    d4,d1
  113.         CALL    CurrentDir
  114.         bra.b    .SpeicherFürFIB
  115.  
  116. ;--------------    wenn Programm mit relativem Pfad aufgerufen wurde
  117. .EinfachLock    move.l    d1,d3
  118.         move.l    a0,d1
  119.         moveq    #ACCESS_READ,d2
  120.         CALL    Lock
  121.         move.l    d0,d5                ; D5: FileLock
  122.         beq    .KeinLock
  123.         movea.l    sp,a0
  124.         cmp.b    #":",(a0,d3.W)
  125.         bne.b    .pfad
  126.         addq.w    #1,d3                ; bei ":" erst dahinter Nullbyte
  127. .pfad        clr.b    (a0,d3.W)
  128.         move.l    a0,d1
  129.         moveq    #ACCESS_READ,d2
  130.         CALL    Lock
  131.         move.l    d0,(my.DirLock)            ; DirLock für Hauptprogramm retten
  132.         beq.b    .KeinSpeicher
  133. .SpeicherFürFIB    move.l    #fib_SIZEOF,d0
  134.         move.l    #MEMF_PUBLIC|MEMF_CLEAR,d1
  135.         CALL    AllocMem,<(execBase).w>    ; RAM für FileInfoBlock
  136.         move.l    d0,d6                ; D6: FileInfoBlock
  137.         beq.b    .KeinSpeicher
  138.         move.l    d0,d2
  139.         move.l    d5,d1                ; D5: FileLock
  140.         CALL    Examine,<(dosBase)>
  141.         tst.l    d0
  142.         beq.b    .KeinExamine
  143.         move.l    d2,a0
  144.         lea    (my.FileName),a1
  145.         lea    (fib_FileName,a0),a0        ; richtiger Dateiname
  146. ..loop        move.b    (a0)+,(a1)+            ; Dateiname kopieren
  147.         bne.b    ..loop
  148. .KeinExamine    move.l    d6,a1                ; D6: FileInfoBlock
  149.         move.l    #fib_SIZEOF,d0
  150.         CALL    FreeMem,<(execBase).w>
  151. .KeinSpeicher    move.l    d5,d1                ; D5: FileLock
  152.         CALL    UnLock,<(dosBase)>
  153. .KeinLock    move.l    d7,d1                ; D7: OldCurrentDir
  154.         CALL    CurrentDir,<(dosBase)>
  155.         unlk    a5
  156.  
  157. ;--------------    SNOOPY addon: keep sticky if argument specified
  158.         tst.l    (argSticky)
  159.         beq.b    .RELEASEME
  160.         jsr    \3    ; must use JSR, because target will be another section
  161.         movea.l    (execBase).w,a6
  162.         lea    (dosName),a1
  163.         lea    (LibList,a6),a0
  164.         CALL    FindName
  165.         movea.l    d0,a6
  166.         move.l    (my.DirLock),d1
  167.         beq.b    .NOUNLOCK
  168.         CALL    UnLock
  169. .NOUNLOCK    moveq    #0,d0
  170.         rts
  171. .RELEASEME
  172.  
  173. ;--------------    Adresse dieses Segments holen
  174.         lea    (StartupCode),a1
  175.         move.l    -4(a1),d3
  176.         move.l    d3,(my.seg)
  177.  
  178. ;--------------    Segment des Hauptprogramms freigeben
  179.         move.l    #MainStartCode,d3
  180.         subq.l    #4,d3
  181.         lsr.l    #2,d3
  182.         clr.l    -4(a1)
  183.  
  184. ;--------------    Eigenen Lock duplizieren
  185.         movea.l    (execBase).w,a0
  186.         movea.l    (ThisTask,a0),a0
  187.         move.l    (pr_CurrentDir,a0),d1
  188.         CALL    DupLock,<(dosBase)>
  189.         move.l    d0,(my.currentdir)
  190.  
  191. ;--------------    Neuen Prozess starten
  192.         push    d0
  193.         CALL    Forbid,<(execBase).w>
  194.         move.l    #dummyName,d1
  195.         moveq    #0,d2
  196.         IFEQ    NARG-1
  197.         move.l    #5000,d4
  198.         ELSE
  199.         move.l    #\4,d4
  200.         ENDC
  201.         CALL    CreateProc,<(dosBase)>
  202.         movea.l    d0,a0                ; A0 zeigt bereits auf pr_MsgPort
  203.         pop    d0
  204.         move.l    d0,(pr_CurrentDir-pr_MsgPort,a0)
  205.         CALL    Permit,<(execBase).w>
  206.         moveq    #0,d0
  207.         rts
  208.  
  209.         section    main,code
  210.  
  211. dummyName    dc.b    "0",0
  212.         even
  213.  
  214. MainStartCode    movea.l    (execBase).w,a0
  215.         move.l    (ThisTask,a0),a0
  216.         move.l    a0,(my.task)
  217.         move.l    #TTHStruktur,(TC_Userdata,a0)    ; Zeiger auf ToolTypeHilfe-Struktur übergeben
  218.         bsr    \3    
  219.         CALL    Forbid,<(execBase).w>
  220.         move.l    (wb.msg),d0
  221.         beq.b    .todos
  222.         movea.l    d0,a1
  223.         CALL    ReplyMsg
  224.         moveq    #0,d0
  225.         rts
  226. .todos        movea.l    (execBase).w,a6
  227.         lea    (dosName),a1
  228.         lea    (LibList,a6),a0
  229.         CALL    FindName
  230.         movea.l    d0,a6
  231.         move.l    (my.DirLock),d1
  232.         CALL    UnLock
  233.         move.l    (my.currentdir),d1
  234.         CALL    UnLock
  235.         move.l    (my.seg),d1
  236.         CALL    UnLoadSeg
  237.         moveq    #0,d0
  238.         rts
  239.  
  240. my.seg        dc.l    0
  241. my.task        dc.l    0
  242. my.currentdir    dc.l    0
  243. ;--------------    Die Reihenfolge aller folgenden Zeiger MÜSSEN mit der
  244. ;-------------- oben definierten ToolTypeHilfe-Struktur übereinstimmen!!
  245. TTHStruktur    dc.l    "TTHi"    ; Kennung
  246. wb.msg        dc.l    0    ; WBStartup oder NULL
  247. my.DirLock    dc.l    0    ; Lock auf Pfad des Programms
  248. my.FileName    ds.b    32    ; Puffer für Dateiname
  249.         ENDM
  250.